#include "upcash.h"

#define	ICC_APDU_Rcv_MAXBUF			( 260UL )
#define	ICC_APDU_Sed_MAXBUF			( 260UL )

#define UP_CARD_NPUBKEY		300 //公钥下载未完成
#define UP_CARD_NICPAR		310 //参数下载未完成

U08 UPPAN57[10];   								
U32 UPPAN57Len;

void Dis_Err_CardDis( U32 errcode, char *errvoic )
{
	U08 buf[100];
	memset(buf,0,100);
	sprintf((char*)buf,"Err Dis = %d,%s\r\n",errcode,(char*)errvoic);
	UP_Hook_Debug_TxData(buf);
}
U32 APP_VoiceDisplay( U08 *voicename )
{
	U08 buf[100];
	memset(buf,0,100);
	sprintf((char*)buf,"Voice = %s\r\n",(char*)voicename);
	UP_Hook_Debug_TxData(buf);
	return 0;
}

/*
**************************************************************************************************************
*         								   读 取 卡 余 额 数 据  (电子现金)
*
*  描 述： 读取卡余额数据
*			  因为读取ED(电子存折文件)需要个人密码PIN
*  参 数： *bl     余额
*          ich     ich=IC卡接口 ic卡接口定义  下层协议选择
*
*  返 回： ICErrorCode    =0 成功
*                         返回非0时,需要检测ICErrorCodercv_len
*
**************************************************************************************************************
*/
U32 UP_GetBalanceEC( U08 *bl, int ich )
{
	unsigned short rcode;

	gCmdBuffer[0] = 0x80;	//CLA
	gCmdBuffer[1] = 0xCA;	//INS
	gCmdBuffer[2] = 0x9F;	//P1
	gCmdBuffer[3] = 0x79;	//P2	‘01’用于ED(电子存折，需要个人密码PIN ‘02’用于EP(电子钱包)
	gCmdBuffer[4] = 0x00;	//Le
	rcode = ICC_APDU_Exchange( ich, gCmdBuffer, 5, gpRcvBuffer, &Grcv_Len, ICC_APDU_Rcv_MAXBUF );
	if( rcode != 0 )
	{ return rcode; }

	if( Grcv_Len < 2 )	  //长度判断
	{ return 2;}
	rcode = ( (gpRcvBuffer[Grcv_Len-2]<<8) | gpRcvBuffer[Grcv_Len-1] );
	if(rcode == 0x9000)
	 { memcpy(bl,&gpRcvBuffer[3],6); }
	else
	 { *bl = 0; }
	return rcode;
}
  
/*
**************************************************************************************************************
*         								   GPO  应用初始化命令  (电子现金)
*
*  描 述： GPO  应用初始化命令
*  参 数： *pdoc   PDOL数据
			len    PDOL数据长度
*          ich     ich=IC卡接口 ic卡接口定义  下层协议选择
*
*  返 回： ICErrorCode    =0 成功
*                         返回非0时,需要检测ICErrorCodercv_len
*
**************************************************************************************************************
*/
U32 UP_GPO( U08 *pdoc,U08 len, int ich )
{
	unsigned short rcode;
	gCmdBuffer[0] = 0x80;	//CLA
	gCmdBuffer[1] = 0xA8;	//INS
	gCmdBuffer[2] = 0x00;	//P1
	gCmdBuffer[3] = 0x00;	//P2	‘01’用于ED(电子存折，需要个人密码PIN ‘02’用于EP(电子钱包)
	gCmdBuffer[4] = len+2;	//Lc
	gCmdBuffer[5] = 0x83;	
	gCmdBuffer[6] = len;	
	memcpy(&gCmdBuffer[7],pdoc,len);
	gCmdBuffer[len+7] = 0x00;	//Le
	rcode = ICC_APDU_Exchange( ich, gCmdBuffer, len+8, gpRcvBuffer, &Grcv_Len, ICC_APDU_Rcv_MAXBUF );
	if( rcode != 0 )
	{ return rcode; }

	if( Grcv_Len < 2 )	  //长度判断
	{ return 2;}
	rcode = ( (gpRcvBuffer[Grcv_Len-2]<<8) | gpRcvBuffer[Grcv_Len-1] );
	return rcode;
}

 
U32 OS_SleepMs( U32 ms )
{
	//os_dly_wait( ( ms / 10 ) );
	return 0;
}

U32 ReRequestCardToActive( void )
{
	return 0;
}

U32 ICF_GetTransProve( U08 *Atc, U08 *Tc, int ich )
{
	return 1;
}


U32 APP_UPCash_Init( void )
{
	U32 rcode;

// 	SysCfg.AppBusSel = 2;	//银行卡，公交都支持 
// 	SysCfg.AppBusRec = 1;	//只上传公交平台

	UP_Par_Configuration( ( DEF_USERID_UP_PosTlv | 0x01000000 ),
						  ( DEF_USERID_UP_SysCfg | 0x01000000 ),
						  ( DEF_USERID_UP_ComStat | 0x01000000 ) );

	UP_Rec_Configuration( DEF_RecMoryBank_Black06,				//CA钥
						  DEF_RecMoryBank_Black07,				//IC卡参数
						  DEF_RecMoryBank_Black04,				//正常记录
						  DEF_RecMoryBank_Black05,			    //异常记录
						  DEF_RecMoryBank_Black08 );			//银联记录返回信息记录

	if( SysCfg.AppBusRec )
	{	UP_Rec_RetInfo( 0 );	}							    //输入为0时，银联记录返回数据上传平台,前提是终端要联公交平台
	else
	{	UP_Rec_RetInfo( 1 );	}	

	rcode = UP_Par_Init( 1 );									//初始化
	if( rcode != 0 )
	{ return rcode; }
	return 0;
}

/*
**************************************************************************************************************
*【3】
*
* 函数原型：void Card_Proc_CUP( void )
*
* 函数功能：银联卡处理 完成用户卡交易扣钱
*
* 函数输入：无
*
* 函数输出：无
*
* 函数返回：0			交易成功
*			其它		失败 
*   
**************************************************************************************************************
*/


U32 Card_Proc_CUP( void )
{
	U32 rcode,i;
	U08 buf[80];
	U08 sel = 1;
	__UP_ExtTradeInformation up_Ext;
	
//	memcpy( TradeInformation.LastCardPhySN, TradeInformation.CardPhySN, 4 );//暂存卡号
	
	memcpy( &buf[0], gSamAppInfo.PsamTID, 6 );							//终端编号
	memcpy( &buf[6], DealCfg.CircuitryID, 2 );							//线路编号
	memcpy( &buf[8], OthCfg.MotoEmpID, 3 );								//司机卡empID
	buf[11] = CPU_CommInfo.HolderCardSn;								//持卡序号
	buf[12] = 2;														//卡类别
	memcpy( &buf[13], SysCfg.AppCityID, 2 );							//交易地城市代码
	memcpy( &buf[15], TradeInformation.CityCode, 2 );					//卡所属地城市代码
	buf[17] = 0x00;
	buf[18] = 0x00;														//消费交易前计数器	HEX	2	卡上的数据
	buf[19] = ( TradeInformation.OldPurseBalance >> 24 );				//用户卡交易前余额
	buf[20] = ( TradeInformation.OldPurseBalance >> 16 );
	buf[21] = ( TradeInformation.OldPurseBalance >>  8 );
	buf[22] = ( TradeInformation.OldPurseBalance >>  0 );
		
	buf[23] = ( TradeInformation.DealMoney >> 8 );						//用户卡交易金额
	buf[24] = TradeInformation.DealMoney;
	
	if( DealCfg.TimePriceStat != 0 )		                            //分段收费模式
	{ buf[25] = 0x40; }
	else
	{ buf[25] = 0x00; }//交易应用类型（测试标记）

	buf[26] = (( 4 << 3 ) | 0x01 );										//钱包类型，记录类型
	memset( &buf[27], 0, 4 );											//SAM交易流水号
	buf[31] = 1;														//主卡类型
	buf[32] = CPU_CommInfo.CardType;									//子卡类型 普通卡，老人卡等
	buf[33] = 0;														//卡内版本，没有使用写0
	buf[34] = 0x01;														//交易性质,公交，地铁等

	if( TradeInformation.CardpPE[3] == 3 )								//次卡折扣金额为0
	{ 
		buf[35] = 0;
		buf[36] = 0;
	}
	else
	{
		i = 0;
		if( TradeInformation.UnitPrice > TradeInformation.DealMoney )
		{ i = TradeInformation.UnitPrice - TradeInformation.DealMoney; }
		buf[35] = ( i >> 8 );
		buf[36] = i;						  							//折扣金额			
	}

	if( DealCfg.TimePriceStat != 0 )									//分段收费模式
	{
//		buf[35] = 0;
//		buf[36] = 0;													//分段收费模式，折扣金额为0
			
		memset( &buf[37], 0, 6 ); 	   							    	//正常
						
		buf[43] = CPUM1_BillInfo.UpID >> 8;								//上车站点编号
		buf[44] = CPUM1_BillInfo.UpID;									//上车站点编号
		buf[45] = ( 0 >> 8 );							//下车站点编号
		buf[46] = 0;									//下车站点编号	
	}
	else
	{
		memset( &buf[37], 0, 6 );										//逃票POS编号		
		memset( &buf[43], 0, 2 );										//上车站点编号
		memset( &buf[45], 0, 2 );										//下车站点编号		
	}
	memset( &buf[47], 0, 4 );											//MAC码
    memcpy( &buf[51], CPUM1_BillInfo.Time, 7 );	                        //上车时间
	up_Ext.ExtRecDataLen = 60;  										//扩展记录数据长度，　没有时建议设为0
	up_Ext.ExtRecData = buf;
	
// 	UP_Icc_Configuration( Gich_Icc );									//配置通道
	UP_ExtTrade_Configuration( &up_Ext );								//配置数据
	
	rcode = UP_CPUCard_Check();											//卡片检测
	if( rcode != 0 )
	{ 
		DEF_SysCard_Debug;
		ICC_PCD_RadioOff(); 
		if(rcode == UP_CARD_NPUBKEY)
		{ DEF_SysCard_Debug;}	//公钥下载未完成
		if(rcode == UP_CARD_NICPAR)
		{ DEF_SysCard_Debug;}	//公钥下载未完成
		return 1; 
	}
//	TradeInformation.DealMoney = 1;
	rcode = UP_CPUCard_ExchInit( TradeInformation.DealMoney, UPPAN57, &UPPAN57Len );
	if( rcode != 0 )													//交易扣钱
	{  
		DEF_SysCard_Debug;
		if( rcode != 999 )
		{ DEF_SysCard_Debug; }
		return 1;
	}
	TradeInformation.OldPurseBalance = UP_Card_GetBalancebehindInit();
	buf[19] = ( TradeInformation.OldPurseBalance >> 24 );				//用户卡交易前余额
	buf[20] = ( TradeInformation.OldPurseBalance >> 16 );
	buf[21] = ( TradeInformation.OldPurseBalance >>  8 );
	buf[22] = ( TradeInformation.OldPurseBalance >>  0 );

	buf[23] = ( TradeInformation.DealMoney >> 8 );						//用户卡交易金额
	buf[24] = TradeInformation.DealMoney;
	if( TradeInformation.CardpPE[3] == 3 )								//次卡折扣金额为0
	{ 
		buf[35] = 0;
		buf[36] = 0;
	}
	else
	{
		i = 0;
		if( TradeInformation.UnitPrice > TradeInformation.DealMoney )
		{ i = TradeInformation.UnitPrice - TradeInformation.DealMoney; }
		buf[35] = ( i >> 8 );
		buf[36] = i;						  							//折扣金额			
	}
	UP_ExtTrade_Configuration( &up_Ext );								//配置数据
	// if( APP_UPCash_BinCheck() )
	// {
	// 	DEF_SysCard_Debug;
	// 	return 1;
	// }
	rcode = UP_CPUCard_ToExch( &TradeInformation.NewPurseBalance, UPPAN57, &UPPAN57Len );
	if( rcode != 0 )													//交易扣钱
	{  
		DEF_SysCard_Debug;
		if( rcode != 999 )
		{ DEF_SysCard_Debug; }
		return 1;
	}

	if( ( DealCfg.TimePriceStat != 0 ) )									//分段收费模式
	{
	
	}
	printf("xiao fei cheng gong!\n");
	
	if( sel == 1 )											//银行卡
	{
		rcode = UP_Card_fDDA();								//脱机数据认证
		if( rcode != 0 )
		{ 
			//APP_PWM_Wait();									//等待脉冲音完成
			Dis_Err_CardDis( 340, "请投币" );				//错误提示
			printf("tuo ji ren zheng shi bai!\n");
			return 1;
		}
		
		OthCfg.UP_MotoCardRecCout++;							//司机卡当班银联记录总数
		OthCfg.UP_MotoCardRecMone += TradeInformation.DealMoney;		
		APP_Save_OthCfg( 0 );								//保存司机汇总信息
		
		//APP_PWM_Wait();										//等待脉冲音完成
		
		if( SysCfg.AudioStat != 0 )							//语音播放
		{ APP_VoiceDisplay( DealCfg.DiscInfo[TradeInformation.CardTypeCout].AudioBuf ); }		
	}
	else
	{
		//APP_PWM_Wait();										//等待脉冲音完成
		
		if( SysCfg.AudioStat != 0 )							//语音播放
		{ APP_VoiceDisplay( DealCfg.DiscInfo[TradeInformation.CardTypeCout].AudioBuf ); }			
	}
/*
***************************************************************************************************
*年检与提示请充值判断
***************************************************************************************************
*/
	if( SysCfg.AppBusMinBalanc > TradeInformation.NewPurseBalance )
	{ 																		//只有电子钱包交易才有效						
		if( TradeInformation.DealMoney != 0 )								//交易金额不为0才进行卡余额语音提示
		{
			
		}
	}
	else if( memcmp( TradeInformation.DealTime, CPU_CommInfo.YearChec_StaDate, 4 ) >= 0 )
	{ 												 						//充值与年检二选一	
	}
	return 0;
}

extern void Hook_Debug_TxData(char* buf);

void UP_Hook_Debug_TxData( U08 *tx_buf )
{
	Hook_Debug_TxData((char*)tx_buf);
}
